App.validator = {
	'empty': function(p, v, f) {
		if ((v && v.replace(/\s+/g, '')) || v === 0) {
			return;
		}
		return mac.msg(Msg.validation['empty'], [ f || '' ]);
	},
	// 数字、字母、下划线、中横线、点
	'en_az-09.': function(p, v, f) {
		var r = /^[A-Za-z0-9_\-\.\w]*$/;
		if (r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['en_az-09.'], [ f || '' ]);
	},
	// 中文、数字、字母、下划线、中横线、点
	'cn_az-09.' : function(p, v, f) {
		var r = /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\w]+$/;
		if(r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['cn_az-09.'], [ f || '' ]);
	},
	// 数字、字母、下划线、中横线、空格、点
	'en_az-09s.': function(p, v, f) {
		var r = /^[A-Za-z0-9_\-\.\w\s]*$/;
		if (r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['en_az-09s.'], [ f || '' ]);
	},
	// 中文、数字、字母、下划线、中横线、空格、点
	'cn_az-09s.' : function(p, v, f) {
		var r = /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\w\s]+$/;
		if(r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['cn_az-09s.'], [ f || '' ]);
	},
	// 数字、字母、下划线、中横线
	'en_az-09': function(p, v, f) {
		var r = /^[A-Za-z0-9_\-\.\w]*$/;
		if(r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['en_az-09'], [ f || '' ]);
	},
	// 中文、数字、字母、下划线、中横线
	'cn_az-09' : function(p, v, f) {
		var r = /^[\u4e00-\u9fa5a-zA-Z0-9_\-\.\w]+$/;
		if(r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['cn_az-09'], [ f || '' ]);
	},
	'ip': function(p, v, f) {
		var r = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
		if(r.test(v)) {
			return;
		}
		return mac.msg(Msg.validation['ip'], [ f || '' ]);
	},
	'len': function(p, v, f) {
		var min = p.min, max = p.max, x = v + '', l = v.len(),
			f = f || '', mv = Msg.validation;
		if ((v == undefined || v == null || !x) && min > 0) {
			return mac.msg(mv.minLen, [ f, min ]);
		}
		if (min && !max && l < min) {
			return mac.msg(mv.minLen, [ f, min ]);
		} else if (!min && max && l > max) {
			return mac.msg(mv.maxLen, [ f, max ]);
		} else if (l < min || l > max) {
			return mac.msg(mv.len, [ f, min, max ]);
		}
	}
}
// 此方法适用于提示标签可相对于表单元素定位的情况
// 参数依次是：验证对象（其属性是用于验证的参数，如：App.base.validation.xxx），表单元素，[待验证的值]
// 只传前两个参数时，要求表单元素支持val()方法
App.validate2 = function(ca, f, v) {
	v = (arguments.length == 2 ? f.val(): v);
	return App.validate(ca, v, f.next('.msg'));
}
// 此方法适用于根据表单元素自动取值的情况
// 参数依次是：验证对象（其属性是用于验证的参数，如：App.base.validation.xxx），表单元素，[提示标签元素]，[字段显示名]
App.validate1 = function(ca, f, m, n) {
	var v = f.val();
	m = m || f.next('.msg');
	return App.validate(ca, v, m, n);
}
// 此方法适用于指定的值和公共提示标签的情况
// 参数依次是：验证对象（其属性是用于验证的参数，如：App.base.validation.xxx），表单元素，[提示标签元素]，[字段显示名]
App.validate = function(ca, v, m, n) {
	for (var k in ca) {
		var x = App.validator[k], a = ca[k];
		if (typeof a == 'function') {
			t = a(v, n);
		} else if (x) {
			t = x(a, v, n);
		} else {
			alert('Missing App.validator ' + k + ' in ' + JSON.stringify(a));
			continue;
		}
		var c = t? 'wrong':'ok';
		m.removeClass("ok wrong").addClass(c).html(t);
		if (t) {
			return false;
		}
	}
	return true;
}
//	// 邮箱验证
//	email: function(str) {
//		var reg = /^[A-Za-z0-9\d]+([-_\.\+]*[A-Za-z0-9\d])*@([a-z0-9\d][a-z0-9\d-]{0,61}[a-z0-9\d]\.)+[a-z\d]{2,6}$/;
//		return reg.test(str);
//	},
//// 手机号码
//phone: function(str) {
//	var reg = /^(13[0-9]|14[0-9]|15[0-9]|170|177|18[0-9])\d{8}$/;
//	return reg.test(str);
//},
//// 固定电话
//tel: function(str) {
//	var reg = /^(([0\+]\d{2,3}-)?(0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/;
//	return reg.test(str);
//},
//// 数量验证
//amount : function(str) {
//	var reg = /^\+?[0-9][0-9]*$/;
//	return reg.test(str);
//},
//// 中文组合
//chinese : function(str) {
//	var reg =/[^u4e00-u9fa5]/g;
//	return reg.test(str);
//},
//// 价格组合
//price : function(str) {
//	var reg =/^\d{0,8}\.{0,1}(\d{1,2})?$/;
//	return reg.test(str);
//},
//idCard : function(card) {
//	return this.idCardVo.check(card);
//},
//// yyyy-MM-dd
//date : function (date){
//	var reg=/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/; 
//	return reg.test(date);
//},
//// 最多i位整数f位小数
//vFloat : function (str,i,f){
//	var a = str.split(".");
//	var reg = /^\d*$/
//	if(a.length ==1 || a.length == 2){
//		if(a[0].length<=i){
//			if(a[0] && reg.test(a[0])){
//				if(a[1]){
//					if(!(reg.test(a[1]) && a[1].length<=f)){
//						return false
//					}
//				}
//				return true;
//			}
//		}
//	}
//	return false;
//},
//// 密码验证 只能输入6-18个字母、数字、下划线   
//password : function(str) {
//	var reg=/^[a-z0-9_-]{6,18}$/;
//	return reg.test(str);
//},
//// 真实姓名验证 姓名是2-15字的汉字
//name : function(str) {
//	var reg=/^\s*[\u4e00-\u9fa5]{1,}[\u4e00-\u9fa5.·]{0,15}[\u4e00-\u9fa5]{1,}\s*$/; 
//	return reg.test(str);
//},
//idCardVo: {
//	vcity: {
//		11 : "北京",
//		12 : "天津",
//		13 : "河北",
//		14 : "山西",
//		15 : "内蒙古",
//		21 : "辽宁",
//		22 : "吉林",
//		23 : "黑龙江",
//		31 : "上海",
//		32 : "江苏",
//		33 : "浙江",
//		34 : "安徽",
//		35 : "福建",
//		36 : "江西",
//		37 : "山东",
//		41 : "河南",
//		42 : "湖北",
//		43 : "湖南",
//		44 : "广东",
//		45 : "广西",
//		46 : "海南",
//		50 : "重庆",
//		51 : "四川",
//		52 : "贵州",
//		53 : "云南",
//		54 : "西藏",
//		61 : "陕西",
//		62 : "甘肃",
//		63 : "青海",
//		64 : "宁夏",
//		65 : "新疆",
//		71 : "台湾",
//		81 : "香港",
//		82 : "澳门",
//		91 : "国外"
//	}, checkProvince: function(card) {
//		// 取身份证前两位,校验省份
//		var province = card.substr(0, 2);
//		if (this.vcity[province] == undefined) {
//			return false;
//		}
//		return true;
//	}, checkBirthday: function(card) {
//		// 检查生日是否正确
//		var len = card.length;
//		// 身份证15位时，次序为省（3位）市（3位）年（2位）月（2位）日（2位）校验位（3位），皆为数字
//		if (len == '15') {
//			var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
//			var arr_data = card.match(re_fifteen);
//			var year = arr_data[2];
//			var month = arr_data[3];
//			var day = arr_data[4];
//			var birthday = new Date('19' + year + '/' + month + '/' + day);
//			return this.verifyBirthday('19' + year, month, day, birthday);
//		}
//		// 身份证18位时，次序为省（3位）市（3位）年（4位）月（2位）日（2位）校验位（4位），校验位末尾可能为X
//		if (len == '18') {
//			var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
//			var arr_data = card.match(re_eighteen);
//			var year = arr_data[2];
//			var month = arr_data[3];
//			var day = arr_data[4];
//			var birthday = new Date(year + '/' + month + '/' + day);
//			return this.verifyBirthday(year, month, day, birthday);
//		}
//		return false;
//	}, verifyBirthday: function(year, month, day, birthday) {
//		// 校验日期
//		var now = new Date();
//		var now_year = now.getFullYear();
//		// 年月日是否合理
//		if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month
//				&& birthday.getDate() == day) {
//			// 判断年份的范围（3岁到100岁之间)
//			var time = now_year - year;
//			if (time >= 3 && time <= 100) {
//				return true;
//			}
//			return false;
//		}
//		return false;
//	}, checkParity: function(card) {
//		// 校验位的检测
//		card = this.change15To18(card); // 15位转18位
//		var len = card.length;
//		if (len == '18') {
//			var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
//					4, 2);
//			var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3',
//					'2');
//			var cardTemp = 0, i, valnum;
//			for (i = 0; i < 17; i++) {
//				cardTemp += card.substr(i, 1) * arrInt[i];
//			}
//			valnum = arrCh[cardTemp % 11];
//			if (valnum == card.substr(17, 1)) {
//				return true;
//			}
//			return false;
//		}
//		return false;
//	}, change15To18: function(card) {
//		// 15位转18位身份证号
//		if (card.length == '15') {
//			var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8,
//					4, 2);
//			var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3',
//					'2');
//			var cardTemp = 0, i;
//			card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
//			for (i = 0; i < 17; i++) {
//				cardTemp += card.substr(i, 1) * arrInt[i];
//			}
//			card += arrCh[cardTemp % 11];
//			return card;
//		}
//		return card;
//	}, check: function(card) {
//		card = card.replace('x', 'X');
//		// 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X
//		card = this.change15To18(card);
//		// 检查省份, 校验生日, 检验位的检测
//		var r = /(^\d{17}(\d|X)$)/;
//		return r.test(card) && this.checkProvince(card) && this.checkBirthday(card) && this.checkParity(card);
//	}
//}